11.3 代码覆盖率

如果说单元测试和性能测试关注代码质量,那么代码覆盖率(code coverage)就是度量测试自身完整和有效性的一种手段。

通过覆盖率值,我们可分析出测试代码的编写质量。检测它是否提供了足够的测试条件,是否执行了足够的函数、语句、分支和代码行等,以此来量化测试本身,让白盒测试真正起到应有的质量保障作用。

当然,这并不是说要追求形式上的数字百分比。关键还是为改进测试提供一个可发现缺陷的机会,毕竟只有测试本身的质量得到保障,才能让它免于成为形式主义摆设。

代码覆盖率也常被用来发现死代码(dead code)。

func TestAdd(t*testing.T) { if add(1,2) !=3{ t.Fatal(“xxx”) } }

输出:

$go test-cover

coverage:100.0%of statements ok test 0.006s

为获取更详细的信息,可指定covermode和coverprofile参数。

  • set:是否执行。
  • count:执行次数。
  • atomic:执行次数,支持并发模式。

$go test-cover-covermode count-coverprofile cover.out

coverage:100.0%of statements ok test 0.007s

$go tool cover-func=cover.out

main.go:5:add 100.0% main.go:9:main 0.0% total: (statements) 50.0%

还可以在浏览器中查看包括具体的执行次数等信息。

$go tool cover-html=cover.out

将鼠标移到具体的代码上,会看到次数提示。